home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / music / replayers / scope_promizer.s < prev    next >
Encoding:
Text File  |  1980-01-04  |  29.8 KB  |  1,480 lines

  1.  
  2.     section "code",code_p
  3.     
  4. start    movem.l    d0-a6,-(a7)            ;save regs.
  5.  
  6.     bsr.w    mt_init                ;init sound
  7.     bsr.w    init_drawsample
  8.  
  9. ; GET OLD COPPERLIST
  10.  
  11.     move.l    4.w,a6
  12.     lea    gfxname(pc),a1
  13.     jsr    -408(a6)
  14.     move.l    d0,a1
  15.     move.l    38(a1),oldcopper
  16.     jsr    -414(a6)
  17.     
  18. ; SAVE SYSTEM
  19.  
  20.     lea    $dff000,a6
  21.     move.w    $1c(a6),d0
  22.     or.w    #$8000,d0        ;set 'setbit'
  23.     move.w    d0,oldintar
  24.     move.l    $6c.w,oldvblanc        ;save system vblanc
  25.     move.w    #$7fff,$9a(a6)        ;stop all system-things
  26.  
  27. ; INIT LEERSPRITES
  28.  
  29.     lea    spritecop,a0
  30.     move.l    #leersprite,d0
  31.     moveq    #7,d7
  32. .sloop    move.w    d0,6(a0)
  33.     swap    d0
  34.     move.w    d0,2(a0)
  35.     swap    d0
  36.     addq.l    #8,a0
  37.     dbf    d7,.sloop
  38.  
  39.  
  40.     move.l    #newcopper,$80(a6)        ;start copper
  41.     move.w    #$83f0,$96(a6)
  42.     move.l    #newint,$6c.w
  43.     move.w    #$c020,$9a(a6)            ;start vblanc
  44.  
  45. buttwait
  46.  
  47.     bsr.b    drawsample
  48.     
  49.     btst    #6,$bfe001
  50.     bne.b    buttwait
  51.  
  52.     bsr.w    mt_end                ;sound ende
  53.  
  54.     move.w    #$7fff,$9a(a6)
  55.     move.l    oldvblanc(pc),$6c.w
  56.     move.w    oldintar(pc),$9a(a6)        ;start system vblanc
  57.     move.w    #$400,$96(a6)            ;clr blitternasty bit
  58.     move.l    oldcopper(pc),$80(a6)        ;save systemcopper
  59. nomenu
  60.     movem.l    (a7)+,d0-a6            ;get regs.
  61.     moveq    #0,d0                ;no error return
  62.     rts                    ;say bye bye !!!!
  63.  
  64. ;------------------------------------------------------------------------------
  65. ;--- INTERUPT HANDLER ---------------------------------------------------------
  66. ;------------------------------------------------------------------------------
  67.  
  68. newint
  69.     movem.l    d0-a6,-(a7)
  70.     lea    $dff000,a6
  71.     move.w    #$20,$9c(a6)            ;intreq löschen
  72.     bsr.w    mt_music
  73.     bsr.w    checksound
  74.     movem.l    (a7)+,d0-a6
  75.     rte
  76.  
  77. ;------------------------------------------------------------------------------
  78. ;--- DRAW SAMPLE --------------------------------------------------------------
  79. ;------------------------------------------------------------------------------
  80. ; WRITTEN IN 1991/92 BY MC68000/TECH ------------------------------------------
  81. ;------------------------------------------------------------------------------
  82.  
  83. viewlength=320            ;no. of samples/voice
  84. screenbreite=40            ;bytes
  85. shifter=3            ;shifter for ysize (lsr.w) 
  86. doubley=0            ;double y pixel (1=an)
  87. xyswap=0            ;swap x and y
  88.  
  89. ; GENERATE MULTIPLIKATIONTABELLE FÜR WAVE_SHOW
  90.  
  91. init_drawsample
  92.     lea    multab(pc),a0
  93.     moveq    #0,d0
  94.     move.w    #255,d7
  95. .wloop    move.w    d0,(a0)+
  96.     add.w    #screenbreite,d0
  97.     dbf    d7,.wloop            ;create multab
  98.     rts
  99.  
  100. drawsample
  101.     moveq    #-1,d0
  102. waitraster
  103.     cmp.b    6(a6),d0
  104.     bne.b    waitraster
  105.  
  106. ; TRIPPLE BUFFERING
  107.  
  108.     lea    screen(pc),a0
  109.     movem.l    (a0),d0-d2
  110.     movem.l    d0-d1,4(a0)
  111.     move.l    d2,(a0)
  112.  
  113. ; SHOW 1.SCREEN 
  114.  
  115.     lea    planecop,a0
  116.     move.w    d2,6(a0)
  117.     swap    d2
  118.     move.w    d2,2(a0)
  119.  
  120. ; CLEAR 2.SCREEN
  121.  
  122. .wb    btst    #14,2(a6)
  123.     bne.b    .wb
  124.     move.l    #$01000000,$40(a6)
  125.     move.w    #0,$66(a6)
  126.     move.l    d0,$54(a6)
  127.     move.w    #256*64+[screenbreite/2],$58(a6)
  128.     move.l    d1,a1
  129.     
  130. ; DRAW 3.SCREEN
  131.  
  132.     lea    multab(pc),a0
  133.     lea    mt_chan1temp(pc),a2        ;adresse st-structur
  134.     lea    ss_sample1(pc),a4        ;adresse showsample
  135.     moveq    #0,d5                ;y adder
  136.     moveq    #0,d3                ;x start
  137.     bsr.b    .drawit
  138.  
  139.     lea    48(a2),a2            ;adresse st-structur
  140.     lea    30(a4),a4            ;adresse showsample
  141.     moveq    #64,d5
  142.     moveq    #0,d3                ;x start
  143.     bsr.b    .drawit
  144.  
  145.     lea    48(a2),a2            ;adresse st-structur
  146.     lea    30(a4),a4            ;adresse showsample
  147.     move.w    #128,d5
  148.     moveq    #0,d3
  149.     bsr.b    .drawit
  150.  
  151.     move.w    #192,d5
  152.     moveq    #0,d3
  153.     lea    48(a2),a2            ;adresse st-structur
  154.     lea    30(a4),a4            ;adresse showsample
  155.  
  156. ; ZEICHNEN --------------------------------------------------------------------
  157.  
  158. .drawit
  159.     moveq    #0,d0
  160.     tst.w    10(a4)                ;neuer ausschlag ???
  161.     beq.b    .nonewaus
  162.  
  163.     move.l    14(a4),(a4)            ;sample adress
  164.     clr.w    4(a4)                ;showadder
  165.     move.w    18(a4),6(a4)            ;period
  166.     move.w    20(a4),8(a4)            ;samplelenght
  167.     clr.w    10(a4)                ;clr anschlag
  168. .nonewaus
  169.     move.w    4(a4),d0            ;showadder
  170.     add.w    6(a4),d0            ;add period
  171.     move.w    d0,4(a4)            ;new showadder sichern
  172.     cmp.w    8(a4),d0            ;showadder > samplelenght
  173.     blo.b    .nolenght
  174.  
  175.     cmp.w    #2,28(a4)            ;check replenght
  176.     blo.b    .noloop                ;<=2 (=kein loop) ???
  177.     move.l    24(a4),(a4)            ;set loopstart    
  178.     move.w    28(a4),d1            ;looplenght
  179.     sub.w    #viewlength,d1
  180.     move.w    d1,8(a4)            ;=new samplelenght
  181.     move.l    (a4),a3
  182.     clr.w    4(a4)                ;show adder = 0
  183.     bra.b    .nolenght    
  184. .noloop
  185.     lea    leersample(pc),a3
  186.     move.l    a3,(a4)                ;sampleadress = leersample
  187.     clr.l    4(a4)                ;showadder & viewadder = 0
  188.     clr.w    8(a4)                ;samplelenght = 0
  189.     bra.b    .newlenght
  190. .nolenght
  191.     move.l    (a4),a3                ;sampleadress
  192.     add.l    d0,a3                ;add showadder
  193. .newlenght
  194.     moveq    #64,d4                ;max volume
  195.     sub.b    19(a2),d4            ;act.vol. - max vol.
  196.     add.w    d4,d4
  197.  
  198.     if viewlength<=128
  199.     moveq    #viewlength-1,d7        ;anzahl samples
  200.     else
  201.     move.w    #viewlength-1,d7
  202.     endc
  203.     
  204.     move.w    #128,d6                ;sample + screenadder 
  205. .drawloop
  206.     moveq    #0,d1                
  207.     move.b    (a3)+,d1            ;sample
  208.     ext.w    d1                ;sample byte auf wordsize
  209.     beq.w    .addready            ;= 0 ???
  210.     bpl.b    .ispos                ;ist positiv
  211.  
  212.     add.w    d4,d1                ;add volume
  213.     ble.b    .addready
  214.     moveq    #0,d1
  215.     bra.b    .addready
  216. .ispos
  217.     sub.w    d4,d1                ;sub volume
  218.     bge.b    .addready
  219.     moveq    #0,d1
  220.  
  221. .addready
  222.     add.w    d6,d1
  223.  
  224.     if shifter>0
  225.     lsr.w    #shifter,d1
  226.     endc
  227.  
  228.     move.w    d3,d0                ;x
  229.     addq.w    #1,d3                ;x + 1
  230.     add.w    d5,d1                ;y adder
  231.  
  232.     if xyswap=1
  233.     exg    d0,d1
  234.     endc
  235.  
  236.     cmp.w    #255,d1
  237.     bcc.b    .nodraw
  238.  
  239.     move.w    d0,d2
  240.     lsr.w    #3,d0
  241.     add.w    d1,d1
  242.     add.w    (a0,d1.w),d0
  243.     not.w    d2
  244.     bset    d2,(a1,d0.w)            ;set pixel in plane
  245.     if doubley=1
  246.     if screenbreite>127
  247.     add.w    #screenbreite,d0
  248.     bset    d2,(a1,d0.w)
  249.     else
  250.     bset    d2,screenbreite(a1,d0.w)
  251.     endc
  252.     endc
  253.  
  254. .nodraw    
  255.     dbf    d7,.drawloop
  256.     rts
  257.  
  258. ; AUSWETUNG (ÜBER VBLANC NACH SOUNDREPLAYER) ----------------------------------
  259.  
  260. checksound
  261.     move.b    mt_counter(pc),d0
  262.     bne.b    .nochange            ;mt_counter = 0 -> new note
  263.  
  264.     lea    mt_chan1temp(pc),a0        ;adresse st-structur
  265.     lea    ss_sample1(pc),a1        ;adresse showsample
  266.     lea    mt_periodtable(pc),a2
  267.     lea    sample_rate(pc),a3
  268.     moveq    #48,d0
  269.     moveq    #30,d1
  270.     moveq    #35*2,d4
  271.     moveq    #3,d7
  272. .checkit
  273.     tst.w    (a0)
  274.     beq.b    .nomodify
  275.     move.w    (a0),10(a1)            ;save anschlag
  276.     move.l    4(a0),14(a1)            ;sampleadress
  277.     move.w    16(a0),d3            ;period
  278.     move.w    #viewlength,d5
  279.     moveq    #0,d2
  280. .checkloop
  281.     cmp.w    (a2,d2.w),d3
  282.     bge.b    .leavecheckloop
  283.     addq.w    #2,d2
  284.     cmp.w    d4,d2
  285.     bne.b    .checkloop
  286. .leavecheckloop
  287.     move.w    (a3,d2.w),18(a1)        ;sample rate
  288.     move.w    8(a0),d3            ;samplelenght
  289.     sub.w    d5,d3                ;- viewsize
  290.     move.w    d3,20(a1)            ;samplelenght
  291.     move.l    10(a0),24(a1)            ;loopstart
  292.     move.w    14(a0),d3
  293.     sub.w    d5,d3
  294.     bmi.b    .noloop
  295.     move.w    14(a0),d3
  296. .noloop
  297.     move.w    d3,28(a1)            ;looplenght
  298. .nomodify
  299.     add.l    d0,a0                ;adresse st-structur
  300.     add.l    d1,a1                ;adresse showsample
  301.     dbf    d7,.checkit
  302. .nochange
  303.     rts
  304.  
  305. ; DATEN BUFFER ----------------------------------------------------------------
  306.  
  307. sample_rate    dc.w    83,88,94,99,106,112,119,126,133,141,150,158,167,177
  308.         dc.w    188,199,211,224,237,251,266,282,298,317,335,354,377
  309.         dc.w    398,421,447,474,501,530,563,597,634
  310. leersample    dcb.b    viewlength
  311.         even
  312. ss_sample1    dcb.b    30*4
  313. multab        dcb.w    256
  314. screen        dc.l    screen1,screen2,screen3
  315.  
  316. oldvblanc    dc.l    0
  317. oldintar    dc.w    0
  318. oldcopper    dc.l    0
  319. gfxname        dc.b    'graphics.library',0,0
  320.  
  321. ;------------------------------------------------------------------------------
  322. ;                      PROMIZER PLAYER V0.1a ... MAY 1992
  323. ;------------------------------------------------------------------------------
  324. ;                           coded by MC68000 of TECH
  325. ;                                Frank Hülsmann
  326. ;                             Timmerscheidtstr. 14
  327. ;                             4400 Münster/Germany
  328. ;------------------------------------------------------------------------------
  329. ;
  330. ; MODIFY 'mt_maxvol' (0-64 ... size : byte) TO SET MAXIMUM ABSOLUT VOLUME !!!
  331. ;
  332. ; THIS PLAYER WORKS WITH FINETUNED SAMPLES BY USING A MINIMUM OF RASTER TIME !!
  333. ; THE CODE BASED ON THE PROTRACKER V1.1b REPLAYER BY ZAP/AMIGA FREELANCERS, BUT
  334. ; IT'S MAX.400% FASTER AND FULLY PC-RELOCATIBLE ...
  335. ;
  336. ;------------------------------------------------------------------------------
  337.  
  338. mt_level6=1            ;1=level 6 interupt on (faster dmareg. init)
  339. mt_dmawaiter=3            ;no.of rasterlines waiting for dma
  340.  
  341. ; INIT_PLAYING ----------------------------------------------------------------
  342.  
  343. mt_init    movem.l    d0-a6,-(a7)
  344.     lea    mt_pm(pc),a5
  345.     move.l    mt_dataptr(pc),a0
  346.  
  347.     lea    762(a0),a1            ;patternlenght
  348.     move.l    (a1)+,d0
  349.     add.l    d0,a1                ;samplestarts
  350.             
  351.     lea    mt_samplestarts(pc),a2
  352.     moveq    #30,d1
  353. mt_samploop
  354.     moveq    #0,d0
  355.     move.w    (a0),d0                ;samplelength in words
  356.     add.l    d0,d0                ;samplelength in bytes
  357.     move.l    a1,(a2)+            ;save sample adress
  358.     add.l    d0,a1                ;next sample
  359.     addq.l    #8,a0                ;next sample info
  360.     dbf    d1,mt_samploop
  361.  
  362.     or.b    #2,$bfe001            ;filter off
  363.     move.b    #6,mt_speed-mt_pm(a5)
  364.     clr.b    mt_counter-mt_pm(a5)
  365.     clr.w    mt_songpos-mt_pm(a5)
  366.     clr.w    mt_patternpos-mt_pm(a5)
  367.     move.l    $78.w,mt_oldirq-mt_pm(a5)    ;save old_irq
  368.     lea    $dff096,a0
  369.     clr.w    $a8-$96(a0)
  370.     clr.w    $b8-$96(a0)
  371.     clr.w    $c8-$96(a0)
  372.     clr.w    $d8-$96(a0)            ;volume voice 1-4 = 0
  373.     moveq    #$f,d0
  374.     move.w    d0,(a0)                ;no sound_dma
  375.  
  376. ; CREATE PERIOD MULTAB (FOR FASTER FINE_TUNING)
  377.  
  378.     moveq    #15,d7
  379.     moveq    #0,d0
  380.     moveq    #72,d1
  381. mt_mulloop2
  382.     move.w    d0,(a5)+
  383.     add.w    d1,d0
  384.     dbf    d7,mt_mulloop2
  385.  
  386. ; CALCULATE RELATIVE JUMP ADRESSES IN JUMPTABS (FOR PC-COMPATIBLE CODE !!!)
  387.  
  388.     lea    mt_init(pc),a0
  389.     move.l    a0,d0
  390.     lea    mt_jumptab1(pc),a0
  391.     lea    mt_jumptab2(pc),a1
  392.     lea    mt_jumptab3(pc),a2
  393.     lea    mt_jumptab4(pc),a3
  394.     moveq    #15,d1
  395. mt_jumpcalcloop
  396.     add.l    d0,(a0)+
  397.     add.l    d0,(a1)+
  398.     add.l    d0,(a2)+
  399.     add.l    d0,(a3)+
  400.     dbf    d1,mt_jumpcalcloop
  401.  
  402.     if mt_level6=1
  403.     lea    mt_irqpointer(pc),a0
  404.     add.l    d0,(a0)
  405.     endc
  406.     
  407.     movem.l    (a7)+,d0-a6
  408.     rts
  409.  
  410. ; END_PLAYING -----------------------------------------------------------------
  411.  
  412. mt_end    movem.l    d0/a0,-(a7)
  413.     move.l    mt_oldirq(pc),$78.w
  414.     lea    $dff096,a0
  415.     clr.w    $a8-$96(a0)
  416.     clr.w    $b8-$96(a0)
  417.     clr.w    $c8-$96(a0)
  418.     clr.w    $d8-$96(a0)
  419.     moveq    #$f,d0
  420.     move.w    d0,(a0)
  421.     movem.l    (a7)+,d0/a0
  422.     rts
  423.  
  424. ; SOUND_PLAYER ---------------------------------------------------------------
  425.  
  426. ; kills d0-d7/a0-a6 !!!!
  427.  
  428. mt_music
  429.     moveq    #$f,d5                ;ander com_low
  430.     moveq    #-16,d6                ;ander com    
  431.     lea    mt_pm(pc),a2
  432.  
  433.     addq.b    #1,mt_counter-mt_pm(a2)
  434.     move.b    mt_counter-mt_pm(a2),d0
  435.     cmp.b    mt_speed-mt_pm(a2),d0
  436.     blo.b    mt_nonewallchannels
  437.     clr.b    mt_counter-mt_pm(a2)
  438.     tst.b    mt_pattdeltime2-mt_pm(a2)
  439.     beq.b    mt_getnewnote
  440.     bsr.b    mt_nonewallchannels
  441.     bra.w    mt_dskip
  442.  
  443. mt_nonewallchannels
  444.     lea    $dff0a0,a5
  445.     lea    mt_chan1temp(pc),a6
  446.     bsr.w    mt_checkefx
  447.     lea    $10(a5),a5
  448.     lea    48(a6),a6
  449.     bsr.w    mt_checkefx
  450.     lea    $10(a5),a5
  451.     lea    48(a6),a6
  452.     bsr.w    mt_checkefx
  453.     lea    $10(a5),a5
  454.     lea    48(a6),a6
  455.     bsr.w    mt_checkefx
  456.     bra.w    mt_nonewposyet
  457.  
  458. mt_getnewnote
  459.     move.l    mt_dataptr(pc),a0
  460.     move.l    a0,a3                ;sample infos
  461.     lea    250(a0),a4            ;patterpositions
  462.     lea    766(a0),a0            ;patterndata
  463.     moveq    #0,d1
  464.     move.w    mt_songpos(pc),d0
  465.     move.l    (a4,d0.w),d1
  466.     add.w    mt_patternpos(pc),d1
  467.  
  468.     clr.w    mt_dmacontemp-mt_pm(a2)
  469.  
  470.     lea    $dff0a0,a5
  471.     lea    mt_chan1temp(pc),a6
  472.     bsr.b    mt_playvoice
  473.     lea    $10(a5),a5
  474.     lea    48(a6),a6
  475.     bsr.b    mt_playvoice
  476.     lea    $10(a5),a5
  477.     lea    48(a6),a6
  478.     bsr.b    mt_playvoice
  479.     lea    $10(a5),a5
  480.     lea    48(a6),a6
  481.     bsr.b    mt_playvoice
  482.     bra.w    mt_setdma
  483.  
  484. mt_playvoice
  485.     tst.l    (a6)
  486.     bne.b    mt_plvskip
  487.     bsr.w    mt_pernop
  488. mt_plvskip
  489.     move.l    (a0,d1.l),d2
  490.     eor.l    d6,d2
  491.     move.l    d2,(a6)
  492.     addq.l    #4,d1
  493.     moveq    #0,d2
  494.     move.l    d2,d3
  495.     move.b    2(a6),d2
  496.     lsr.b    #4,d2
  497.     move.b    (a6),d0
  498.     and.b    d6,d0
  499.     or.b    d0,d2
  500.     beq.w    mt_setregs
  501.     lea    mt_samplestarts(pc),a1
  502.     subq.w    #1,d2
  503.     lsl.w    #2,d2
  504.     move.w    d2,d4
  505.     add.w    d4,d4    
  506.     move.w    (a3,d4.w),8(a6)
  507.     move.w    (a3,d4.w),40(a6)        ;sample lenght in words
  508.     move.l    (a1,d2.w),4(a6)            ;sample adress
  509.  
  510.     moveq    #0,d0
  511.     move.b    2(a3,d4.w),d0
  512.     move.b    d0,18(a6)            ;set finetune number
  513.     add.w    d0,d0
  514.     move.w    (a2,d0.w),d0
  515.     lea    mt_periodtable(pc),a4
  516.     add.l    d0,a4
  517.     move.l    a4,44(a6)            ;save periodtable
  518.  
  519.  
  520.     move.b    3(a3,d4.w),d0            ;sample volume
  521.     cmp.b    mt_maxvol(pc),d0
  522.     bls.b    mt_nv
  523.     move.b    mt_maxvol(pc),d0        ;cut volume -> no relative
  524. mt_nv                        ;calculation here ...
  525.     move.b    d0,19(a6)
  526.  
  527.     move.w    4(a3,d4.w),d3             ;get repeat
  528.     beq.b    mt_noloop
  529.     move.l    4(a6),d2            ;get start
  530.     add.w    d3,d3
  531.     add.l    d3,d2                ;add repeat
  532.     move.l    d2,10(a6)
  533.     move.l    d2,36(a6)
  534.     move.w    4(a3,d4.w),d0            ;get repeat
  535.     add.w    6(a3,d4.w),d0            ;add replen
  536.     move.w    d0,8(a6)
  537.     move.w    6(a3,d4.w),14(a6)        ;save replen
  538.     move.b    19(a6),9(a5)            ;init volume
  539.     bra.b    mt_setregs
  540. mt_noloop
  541.     move.l    4(a6),d2
  542.     add.l    d3,d2
  543.     move.l    d2,10(a6)
  544.     move.l    d2,36(a6)
  545.     move.w    6(a3,d4.w),14(a6)        ;save replen
  546.     move.b    19(a6),9(a5)
  547. mt_setregs
  548.     move.w    (a6),d0
  549.     and.w    #$0fff,d0
  550.     beq.w    mt_checkmoreefx            ;if no note
  551.     move.w    2(a6),d0
  552.     and.w    #$0ff0,d0
  553.     cmp.w    #$0e50,d0
  554.     beq.b    mt_dosetfinetune
  555.     moveq    #0,d0
  556.     move.b    2(a6),d0
  557.     and.b    d5,d0
  558.     lsl.b    #2,d0
  559.     move.l    mt_jumptab3(pc,d0.w),a4
  560.     jmp    (a4)
  561.  
  562. mt_jumptab3    
  563.     dcb.l    3,mt_setperiod-mt_init
  564.     dc.l    mt_chktoneporta-mt_init,mt_setperiod-mt_init
  565.     dc.l    mt_chktoneporta-mt_init
  566.     dcb.l    3,mt_setperiod-mt_init
  567.     dc.l    mt_moreplusperiod-mt_init
  568.     dcb.l    7,mt_setperiod-mt_init
  569.  
  570. mt_moreplusperiod
  571.     bsr.w    mt_checkmoreefx
  572.     bra.b    mt_setperiod
  573.  
  574. mt_dosetfinetune
  575.     bsr.w    mt_setfinetune
  576.     bra.b    mt_setperiod
  577.  
  578. mt_chktoneporta
  579.     bsr.w    mt_settoneporta
  580.     bra.w    mt_checkmoreefx
  581.  
  582. mt_setperiod
  583.     move.w    (a6),d2
  584.     and.w    #$0fff,d2        ; period 'ausanden'
  585.     move.w    d2,16(a6)        ; set normal period
  586.     move.w    2(a6),d0
  587.     and.w    #$0ff0,d0
  588.     cmp.w    #$0ed0,d0         ; notedelay
  589.     beq.w    mt_checkmoreefx
  590.  
  591.     move.w    20(a6),$dff096
  592.     btst    #2,30(a6)
  593.     bne.b    mt_vibnoc
  594.     clr.b    27(a6)
  595. mt_vibnoc
  596.     btst    #6,30(a6)
  597.     bne.b    mt_trenoc
  598.     clr.b    29(a6)
  599. mt_trenoc
  600.     move.l    4(a6),(a5)        ; init start
  601.     move.w    8(a6),4(a5)        ; init length
  602.     move.w    16(a6),6(a5)        ; init period
  603.     
  604.     move.w    20(a6),d0
  605.     or.w    d0,mt_dmacontemp-mt_pm(a2)
  606.     bra.w    mt_checkmoreefx
  607.  
  608. mt_setdma
  609.     if mt_level6=0
  610.     bsr.w    mt_dmawait
  611.     move.w    mt_dmacontemp(pc),d0
  612.     or.w    #$8000,d0
  613.     move.w    d0,$dff096
  614.     bsr.w    mt_dmawait
  615.     lea    $dff0a0,a5
  616.     lea    mt_chan1temp(pc),a6
  617.     move.l    10(a6),(a5)
  618.     move.w    14(a6),4(a5)
  619.     move.l    58(a6),$10(a5)
  620.     move.w    62(a6),$14(a5)
  621.     move.l    106(a6),$20(a5)
  622.     move.w    110(a6),$24(a5)
  623.     move.l    154(a6),$30(a5)
  624.     move.w    158(a6),$34(a5)
  625.     else
  626.  
  627.     lea    $bfd000,a3
  628.     move.b    #$7f,$d00(a3)
  629.     move.w    #$2000,$dff09c
  630.     move.w    #$a000,$dff09a
  631.     lea    mt_irq1(pc),a4
  632.     move.l    a4,$78.w
  633.     moveq    #0,d0
  634.     move.b    d0,$e00(a3)
  635.     move.b    #$a8,$400(a3)
  636.     move.b    d0,$500(a3)
  637.     move.b    #$11,$e00(a3)
  638.     move.b    #$81,$d00(a3)
  639.     or.w    #$8000,mt_dmacontemp-mt_pm(a2)
  640.     bra.w    mt_dskip
  641.  
  642.  
  643. mt_irq1
  644.     tst.b    $bfdd00
  645.     move.w    mt_dmacontemp(pc),$dff096
  646.     move.w    #$2000,$dff09c
  647.     move.l    mt_irqpointer(pc),$78.w
  648.     rte
  649.  
  650. mt_irqpointer    dc.l    mt_irq2-mt_init
  651.  
  652. mt_irq2
  653.     tst.b    $bfdd00
  654.     movem.l    a5-a6,-(a7)
  655.  
  656.     lea    $dff0a0,a5
  657.     lea    mt_chan1temp(pc),a6
  658.     move.l    10(a6),(a5)
  659.     move.w    14(a6),4(a5)
  660.     move.l    58(a6),$10(a5)
  661.     move.w    62(a6),$14(a5)
  662.     move.l    106(a6),$20(a5)
  663.     move.w    110(a6),$24(a5)
  664.     move.l    154(a6),$30(a5)
  665.     move.w    158(a6),$34(a5)
  666.     clr.b    $bfde00
  667.     move.b    #$7f,$bfdd00
  668.     move.w    #$2000,$dff09c
  669.     movem.l    (a7)+,a5-a6
  670.     rte
  671.     endc
  672.  
  673. mt_dskip
  674.     add.w    #16,mt_patternpos-mt_pm(a2)
  675.     move.b    mt_pattdeltime(pc),d0
  676.     beq.b    mt_dskc
  677.     move.b    d0,mt_pattdeltime2-mt_pm(a2)
  678.     clr.b    mt_pattdeltime-mt_pm(a2)
  679. mt_dskc    tst.b    mt_pattdeltime2-mt_pm(a2)
  680.     beq.b    mt_dska
  681.     subq.b    #1,mt_pattdeltime2-mt_pm(a2)
  682.     beq.b    mt_dska
  683.     sub.w    #16,mt_patternpos-mt_pm(a2)
  684. mt_dska    tst.b    mt_pbreakflag-mt_pm(a2)
  685.     beq.b    mt_nnpysk
  686.     sf    mt_pbreakflag-mt_pm(a2)
  687.     moveq    #0,d0
  688.     move.b    mt_pbreakpos(pc),d0
  689.     clr.b    mt_pbreakpos-mt_pm(a2)
  690.     lsl.w    #4,d0
  691.     move.w    d0,mt_patternpos-mt_pm(a2)
  692. mt_nnpysk
  693.     cmp.w    #1024,mt_patternpos-mt_pm(a2)
  694.     blo.b    mt_nonewposyet
  695. mt_nextposition    
  696.     moveq    #0,d0
  697.     move.b    mt_pbreakpos(pc),d0
  698.     lsl.w    #4,d0
  699.     move.w    d0,mt_patternpos-mt_pm(a2)
  700.     clr.b    mt_pbreakpos-mt_pm(a2)
  701.     clr.b    mt_posjumpflag-mt_pm(a2)
  702.     addq.w    #4,mt_songpos-mt_pm(a2)
  703.     and.w    #511,mt_songpos-mt_pm(a2)
  704.     move.w    mt_songpos(pc),d1
  705.     move.l    mt_dataptr(pc),a0
  706.     cmp.w    248(a0),d1
  707.     blo.b    mt_nonewposyet
  708.     clr.w    mt_songpos-mt_pm(a2)
  709. mt_nonewposyet    
  710.     tst.b    mt_posjumpflag-mt_pm(a2)
  711.     bne.b    mt_nextposition
  712.     rts
  713.  
  714. mt_checkefx
  715.     bsr.w    mt_updatefunk
  716.     move.w    2(a6),d0
  717.     and.w    #$0fff,d0
  718.     beq.b    mt_pernop
  719.     moveq    #0,d0
  720.     move.b    2(a6),d0
  721.     and.b    d5,d0
  722.     move.w    d0,d2
  723.     lsl.b    #2,d2    
  724.     move.l    mt_jumptab1(pc,d2.w),a4
  725.     jmp    (a4)
  726.  
  727. mt_jumptab1
  728.     dc.l    mt_arpeggio-mt_init,mt_portaup-mt_init,mt_portadown-mt_init
  729.     dc.l    mt_toneportamento-mt_init
  730.     dc.l    mt_vibrato-mt_init,mt_toneplusvolslide-mt_init
  731.     dc.l    mt_vibratoplusvolslide-mt_init
  732.     dcb.l    7,mt_setback-mt_init
  733.     dc.l    mt_e_commands-mt_init,mt_setback-mt_init
  734.  
  735. mt_setback    
  736.     move.w    16(a6),6(a5)
  737.     subq.b    #7,d0
  738.     beq.w    mt_tremolo
  739.     subq.b    #3,d0
  740.     beq.w    mt_volumeslide
  741. mt_return2
  742.     rts
  743.  
  744. mt_pernop
  745.     move.w    16(a6),6(a5)
  746.     rts
  747.  
  748. mt_arpeggio
  749.     moveq    #0,d0
  750.     move.b    mt_counter(pc),d0
  751.     moveq    #3,d2
  752.     divs    d2,d0
  753.     swap    d0
  754.     tst.w    d0
  755.     beq.b    mt_arpeggio2
  756.     subq.w    #2,d0
  757.     beq.b    mt_arpeggio1
  758.     moveq    #0,d0
  759.     move.b    3(a6),d0
  760.     lsr.b    #4,d0
  761.     bra.b    mt_arpeggio3
  762.  
  763. mt_arpeggio1
  764.     moveq    #0,d0
  765.     move.b    3(a6),d0
  766.     and.b    d5,d0
  767.     bra.b    mt_arpeggio3
  768.  
  769. mt_arpeggio2
  770.     move.w    16(a6),d2
  771.     bra.b    mt_arpeggio4
  772.  
  773. mt_arpeggio3
  774.     add.w    d0,d0
  775.     move.l    44(a6),a0
  776.     moveq    #36,d7
  777. mt_arploop
  778.     move.w    (a0,d0.w),d2
  779.     cmp.w    (a0),d1
  780.     bhs.b    mt_arpeggio4
  781.     addq.l    #2,a0
  782.     dbf    d7,mt_arploop
  783.     rts
  784.  
  785. mt_arpeggio4
  786.     move.w    d2,6(a5)
  787.     rts
  788.  
  789. mt_fineportaup
  790.     tst.b    mt_counter-mt_pm(a2)
  791.     bne.b    mt_return2
  792.     move.b    d1,mt_lowmask-mt_pm(a2)
  793. mt_portaup
  794.     moveq    #0,d0
  795.     move.b    3(a6),d0
  796.     and.b    mt_lowmask(pc),d0
  797.     move.b    #$ff,mt_lowmask-mt_pm(a2)
  798.     sub.w    d0,16(a6)
  799.     move.w    16(a6),d0
  800.     and.w    #$0fff,d0
  801.     cmp.w    #113,d0
  802.     bhi.b    mt_portauskip
  803.     and.w    #$f000,16(a6)
  804.     or.w    #113,16(a6)
  805. mt_portauskip
  806.     move.w    16(a6),d0
  807.     and.w    #$0fff,d0
  808.     move.w    d0,6(a5)
  809.     rts    
  810.  
  811. mt_fineportadown
  812.     tst.b    mt_counter-mt_pm(a2)
  813.     bne.w    mt_return2
  814.     move.b    d5,mt_lowmask-mt_pm(a2)
  815. mt_portadown
  816.     moveq    #0,d0
  817.     move.b    3(a6),d0
  818.     and.b    mt_lowmask(pc),d0
  819.     move.b    #$ff,mt_lowmask-mt_pm(a2)
  820.     add.w    d0,16(a6)
  821.     move.w    16(a6),d0
  822.     and.w    #$0fff,d0
  823.     cmp.w    #856,d0
  824.     blo.b    mt_portadskip
  825.     and.w    #$f000,16(a6)
  826.     or.w    #856,16(a6)
  827. mt_portadskip
  828.     move.w    16(a6),d0
  829.     and.w    #$0fff,d0
  830.     move.w    d0,6(a5)
  831.     rts
  832.  
  833. mt_settoneporta
  834.     move.w    (a6),d2
  835.     and.w    #$0fff,d2
  836.     move.l    44(a6),a4
  837.     moveq    #0,d0
  838. mt_stploop
  839.     cmp.w    (a4,d0.w),d2
  840.     bhs.b    mt_stpfound
  841.     addq.w    #2,d0
  842.     cmp.w    #37*2,d0
  843.     blo.b    mt_stploop
  844.     moveq    #35*2,d0
  845. mt_stpfound
  846.     move.b    18(a6),d2
  847.     and.b    #8,d2
  848.     beq.b    mt_stpgoss
  849.     tst.w    d0
  850.     beq.b    mt_stpgoss
  851.     subq.w    #2,d0
  852. mt_stpgoss
  853.     move.w    (a4,d0.w),d2
  854.     move.w    d2,24(a6)
  855.     move.w    16(a6),d0
  856.     clr.b    22(a6)
  857.     cmp.w    d0,d2
  858.     beq.b    mt_cleartoneporta
  859.     bge.w    mt_return2
  860.     move.b    #1,22(a6)
  861.     rts
  862.  
  863. mt_cleartoneporta
  864.     clr.w    24(a6)
  865.     rts
  866.  
  867. mt_toneportamento
  868.     move.b    3(a6),d0
  869.     beq.b    mt_toneportnochange
  870.     move.b    d0,23(a6)
  871.     clr.b    3(a6)
  872. mt_toneportnochange
  873.     tst.w    24(a6)
  874.     beq.w    mt_return2
  875.     moveq    #0,d0
  876.     move.b    23(a6),d0
  877.     tst.b    22(a6)
  878.     bne.b    mt_toneportaup
  879. mt_toneportadown
  880.     add.w    d0,16(a6)
  881.     move.w    24(a6),d0
  882.     cmp.w    16(a6),d0
  883.     bgt.b    mt_toneportasetper
  884.     move.w    24(a6),16(a6)
  885.     clr.w    24(a6)
  886.     bra.b    mt_toneportasetper
  887.  
  888. mt_toneportaup
  889.     sub.w    d0,16(a6)
  890.     move.w    24(a6),d0
  891.     cmp.w    16(a6),d0
  892.     blt.b    mt_toneportasetper
  893.     move.w    24(a6),16(a6)
  894.     clr.w    24(a6)
  895.  
  896. mt_toneportasetper
  897.     move.w    16(a6),d2
  898.     move.b    31(a6),d0
  899.     and.b    d5,d0
  900.     beq.b    mt_glissskip
  901.  
  902.     move.l    44(a6),a0
  903.     moveq    #35,d7
  904. mt_glissloop
  905.     cmp.w    (a0)+,d2
  906.     bge.b    mt_glissfound
  907.     dbf    d7,mt_glissloop
  908.     subq.l    #2,a0
  909. mt_glissfound
  910.     move.w    -2(a0),d2
  911. mt_glissskip
  912.     move.w    d2,6(a5)         ; set period
  913.     rts
  914.  
  915. mt_vibrato
  916.     move.b    3(a6),d0
  917.     beq.b    mt_vibrato2
  918.     move.b    26(a6),d2
  919.     and.b    d5,d0
  920.     beq.b    mt_vibskip
  921.     and.b    d6,d2
  922.     or.b    d0,d2
  923. mt_vibskip
  924.     move.b    3(a6),d0
  925.     and.b    d6,d0
  926.     beq.b    mt_vibskip2
  927.     and.b    d5,d2
  928.     or.b    d0,d2
  929. mt_vibskip2
  930.     move.b    d2,26(a6)
  931. mt_vibrato2
  932.     move.b    27(a6),d0
  933.     lea    mt_vibratotable(pc),a4
  934.     lsr.w    #2,d0
  935.     and.w    #$001f,d0
  936.     moveq    #0,d2
  937.     move.b    30(a6),d2
  938.     and.b    #$03,d2
  939.     beq.b    mt_vib_sine
  940.     lsl.b    #3,d0
  941.     cmp.b    #1,d2
  942.     beq.b    mt_vib_rampdown
  943.     moveq    #-1,d2
  944.     bra.b    mt_vib_set
  945. mt_vib_rampdown
  946.     tst.b    27(a6)
  947.     bpl.b    mt_vib_rampdown2
  948.     moveq    #-1,d2
  949.     sub.b    d0,d2
  950.     bra.b    mt_vib_set
  951. mt_vib_rampdown2
  952.     move.b    d0,d2
  953.     bra.b    mt_vib_set
  954. mt_vib_sine
  955.     move.b    (a4,d0.w),d2
  956. mt_vib_set
  957.     move.b    26(a6),d0
  958.     and.w    d5,d0
  959.     mulu    d0,d2
  960.     lsr.w    #7,d2
  961.     move.w    16(a6),d0
  962.     tst.b    27(a6)
  963.     bmi.b    mt_vibratoneg
  964.     add.w    d2,d0
  965.     bra.b    mt_vibrato3
  966. mt_vibratoneg
  967.     sub.w    d2,d0
  968. mt_vibrato3
  969.     move.w    d0,6(a5)
  970.     move.b    26(a6),d0
  971.     lsr.w    #2,d0
  972.     and.w    #$003c,d0
  973.     add.b    d0,27(a6)
  974.     rts
  975.  
  976. mt_toneplusvolslide
  977.     bsr.w    mt_toneportnochange
  978.     bra.w    mt_volumeslide
  979.  
  980. mt_vibratoplusvolslide
  981.     bsr.b    mt_vibrato2
  982.     bra.w    mt_volumeslide
  983.  
  984. mt_tremolo
  985.     move.b    3(a6),d0
  986.     beq.b    mt_tremolo2
  987.     move.b    28(a6),d2
  988.     and.b    d5,d0
  989.     beq.b    mt_treskip
  990.     and.b    d6,d2
  991.     or.b    d0,d2
  992. mt_treskip
  993.     move.b    3(a6),d0
  994.     and.b    d6,d0
  995.     beq.b    mt_treskip2
  996.     and.b    d5,d2
  997.     or.b    d0,d2
  998. mt_treskip2
  999.     move.b    d2,28(a6)
  1000. mt_tremolo2
  1001.     move.b    29(a6),d0
  1002.     lea    mt_vibratotable(pc),a4
  1003.     lsr.w    #2,d0
  1004.     moveq    #$1f,d2
  1005.     and.w    d2,d0
  1006.     move.b    30(a6),d2
  1007.     and.w    d6,d2
  1008.     lsr.b    #4,d2
  1009.     and.b    #$03,d2
  1010.     beq.b    mt_tre_sine
  1011.     lsl.b    #3,d0
  1012.     cmp.b    #1,d2
  1013.     beq.b    mt_tre_rampdown
  1014.     moveq    #-1,d2
  1015.     bra.b    mt_tre_set
  1016. mt_tre_rampdown
  1017.     tst.b    27(a6)
  1018.     bpl.b    mt_tre_rampdown2
  1019.     moveq    #-1,d2
  1020.     sub.b    d0,d2
  1021.     bra.b    mt_tre_set
  1022. mt_tre_rampdown2
  1023.     move.b    d0,d2
  1024.     bra.b    mt_tre_set
  1025. mt_tre_sine
  1026.     move.b    (a4,d0.w),d2
  1027. mt_tre_set
  1028.     move.b    28(a6),d0
  1029.     and.w    d5,d0
  1030.     mulu    d0,d2
  1031.     lsr.w    #6,d2
  1032.     moveq    #0,d0
  1033.     move.b    19(a6),d0
  1034.     tst.b    29(a6)
  1035.     bmi.b    mt_tremoloneg
  1036.     add.w    d2,d0
  1037.     bra.b    mt_tremolo3
  1038. mt_tremoloneg
  1039.     sub.w    d2,d0
  1040. mt_tremolo3
  1041.     bpl.b    mt_tremoloskip
  1042.     moveq    #0,d0
  1043. mt_tremoloskip
  1044.     cmp.b    mt_maxvol(pc),d0
  1045.     bls.b    mt_tremolook
  1046.     move.b    mt_maxvol(pc),d0
  1047. mt_tremolook
  1048.     move.b    d0,9(a5)
  1049.     move.b    28(a6),d0
  1050.     lsr.w    #2,d0
  1051.     and.w    #$003c,d0
  1052.     add.b    d0,29(a6)
  1053.     rts
  1054.  
  1055. mt_sampleoffset
  1056.     moveq    #0,d0
  1057.     move.b    3(a6),d0
  1058.     beq.b    mt_sononew
  1059.     move.b    d0,32(a6)
  1060. mt_sononew
  1061.     move.b    32(a6),d0
  1062.     lsl.w    #7,d0
  1063.     cmp.w    8(a6),d0
  1064.     bge.b    mt_sofskip
  1065.     sub.w    d0,8(a6)
  1066.     add.w    d0,d0
  1067.     add.l    d0,4(a6)
  1068.     rts
  1069. mt_sofskip
  1070.     move.w    #1,8(a6)
  1071.     rts
  1072.  
  1073. mt_volumeslide
  1074.     move.b    3(a6),d0
  1075.     lsr.b    #4,d0
  1076.     beq.b    mt_volslidedown
  1077. mt_volslideup
  1078.     add.b    d0,19(a6)
  1079.     move.b    mt_maxvol(pc),d2
  1080.     cmp.b    19(a6),d2
  1081.     bge.b    mt_vsuskip
  1082.     move.b    d2,19(a6)
  1083. mt_vsuskip
  1084.     move.b    19(a6),9(a5)
  1085.     rts
  1086.  
  1087. mt_volslidedown
  1088.     move.b    3(a6),d0
  1089.     and.b    d5,d0
  1090. mt_volslidedown2
  1091.     sub.b    d0,19(a6)
  1092.     bpl.b    mt_vsdskip
  1093.     clr.b    19(a6)
  1094. mt_vsdskip
  1095.     move.b    19(a6),9(a5)
  1096.     rts
  1097.  
  1098. mt_positionjump
  1099.     moveq    #0,d0
  1100.     move.b    3(a6),d0
  1101.     subq.b    #1,d0
  1102.     lsl.w    #2,d0
  1103.     move.w    d0,mt_songpos-mt_pm(a2)
  1104. mt_pj2    clr.b    mt_pbreakpos-mt_pm(a2)
  1105.     st     mt_posjumpflag-mt_pm(a2)
  1106.     rts
  1107.  
  1108. mt_volumechange
  1109.     move.b    3(a6),d0
  1110.     cmp.b    mt_maxvol(pc),d0
  1111.     ble.b    mt_volumeok
  1112.     move.b    mt_maxvol(pc),d0
  1113. mt_volumeok
  1114.     move.b    d0,19(a6)
  1115.     move.b    d0,9(a5)
  1116.     rts
  1117.  
  1118. mt_patternbreak
  1119.     move.b    3(a6),d0
  1120.     move.b    d0,d2
  1121.     lsr.b    #4,d0
  1122.     move.b    d0,d1
  1123.     add.b    d0,d0        ;*2
  1124.     lsl.b    #3,d1        ;*8
  1125.     add.b    d1,d0        ;+ -> *10
  1126.     and.b    d5,d2
  1127.     add.b    d2,d0
  1128.     cmp.b    #63,d0
  1129.     bhi.b    mt_pj2
  1130.     move.b    d0,mt_pbreakpos-mt_pm(a2)
  1131.     st    mt_posjumpflag-mt_pm(a2)
  1132.     rts
  1133.  
  1134. mt_setspeed
  1135.     move.b    3(a6),d0
  1136.     beq.w    mt_return2
  1137.     clr.b    mt_counter-mt_pm(a2)
  1138.     move.b    d0,mt_speed-mt_pm(a2)
  1139.     rts
  1140.  
  1141. mt_checkmoreefx
  1142.     bsr.w    mt_updatefunk
  1143.     moveq    #0,d0
  1144.     move.b    2(a6),d0
  1145.     and.b    d5,d0
  1146.     lsl.b    #2,d0
  1147.     move.l    mt_jumptab4(pc,d0.w),a4
  1148.     jmp    (a4)
  1149.  
  1150. mt_jumptab4    
  1151.     dcb.l    9,mt_pernop-mt_init
  1152.     dc.l    mt_sampleoffset-mt_init,mt_pernop-mt_init
  1153.     dc.l    mt_positionjump-mt_init
  1154.     dc.l    mt_volumechange-mt_init,mt_patternbreak-mt_init
  1155.     dc.l    mt_e_commands-mt_init,mt_setspeed-mt_init,mt_pernop-mt_init
  1156.  
  1157. mt_e_commands
  1158.     moveq    #0,d0
  1159.     move.b    3(a6),d0
  1160.     lsr.b    #4,d0
  1161.     lsl.b    #2,d0
  1162.     move.l    mt_jumptab2(pc,d0.w),a4
  1163.     jmp    (a4)
  1164.  
  1165. mt_jumptab2    
  1166.     dc.l    mt_filteronoff-mt_init,mt_fineportaup-mt_init
  1167.     dc.l    mt_fineportadown-mt_init
  1168.     dc.l    mt_setglisscontrol-mt_init,mt_setvibratocontrol-mt_init
  1169.     dc.l    mt_setfinetune-mt_init
  1170.     dc.l    mt_jumploop-mt_init,mt_settremolocontrol-mt_init
  1171.     dc.l    mt_return2-mt_init,mt_retrignote-mt_init
  1172.     dc.l    mt_volumefineup-mt_init
  1173.     dc.l    mt_volumefinedown-mt_init,mt_notecut-mt_init
  1174.     dc.l    mt_notedelay-mt_init
  1175.     dc.l    mt_patterndelay-mt_init,mt_funkit-mt_init
  1176.  
  1177. mt_filteronoff
  1178.     move.b    3(a6),d0
  1179.     and.b    #1,d0
  1180.     add.w    d0,d0
  1181.     and.b    #$fd,$bfe001
  1182.     or.b    d0,$bfe001
  1183.     rts    
  1184.  
  1185. mt_setglisscontrol
  1186.     move.b    3(a6),d0
  1187.     and.b    d5,d0
  1188.     and.b    d6,31(a6)
  1189.     or.b    d0,31(a6)
  1190.     rts
  1191.  
  1192. mt_setvibratocontrol
  1193.     move.b    3(a6),d0
  1194.     and.b    d5,d0
  1195.     and.b    d6,30(a6)
  1196.     or.b    d0,30(a6)
  1197.     rts
  1198.  
  1199. mt_setfinetune
  1200.     moveq    #0,d0
  1201.     move.b    3(a6),d0
  1202.     and.b    d5,d0
  1203.     move.b    d0,18(a6)
  1204.     add.w    d0,d0
  1205.     move.w    (a2,d0.w),d0
  1206.     lea    mt_periodtable(pc),a4
  1207.     add.l    d0,a4
  1208.     move.l    a4,44(a6)
  1209.     rts
  1210.  
  1211. mt_jumploop
  1212.     move.b    mt_counter(pc),d1
  1213.     bne.w    mt_return2
  1214.     move.b    3(a6),d0
  1215.     and.b    d5,d0
  1216.     beq.b    mt_setloop
  1217.     tst.b    34(a6)
  1218.     beq.b    mt_jumpcnt
  1219.     subq.b    #1,34(a6)
  1220.     beq.w    mt_return2
  1221. mt_jmploop    
  1222.     move.b    33(a6),mt_pbreakpos-mt_pm(a2)
  1223.     st    mt_pbreakflag-mt_pm(a2)
  1224.     rts
  1225.  
  1226. mt_jumpcnt
  1227.     move.b    d0,34(a6)
  1228.     bra.b    mt_jmploop
  1229.  
  1230. mt_setloop
  1231.     move.w    mt_patternpos(pc),d0
  1232.     lsr.w    #4,d0
  1233.     move.b    d0,33(a6)
  1234.     rts
  1235.  
  1236. mt_settremolocontrol
  1237.     move.b    3(a6),d0
  1238.     and.b    d5,d0
  1239.     lsl.b    #4,d0
  1240.     and.b    d5,30(a6)
  1241.     or.b    d0,30(a6)
  1242.     rts
  1243.  
  1244. mt_retrignote
  1245.     move.b    3(a6),d0
  1246.     and.b    d5,d0
  1247.     beq.b    mt_rtnend
  1248.     moveq    #0,d2
  1249.     move.b    mt_counter(pc),d2
  1250.     bne.b    mt_rtnskp
  1251.     move.w    (a6),d2
  1252.     and.w    #$0fff,d2
  1253.     bne.b    mt_rtnend
  1254.     moveq    #0,d2
  1255.     move.b    mt_counter(pc),d2
  1256. mt_rtnskp
  1257.     divu    d0,d2
  1258.     swap    d2
  1259.     tst.w    d2
  1260.     bne.b    mt_rtnend
  1261. mt_doretrig
  1262.     move.w    20(a6),$dff096        ; channel dma off
  1263.     move.l    4(a6),(a5)        ; set sampledata pointer
  1264.     move.w    8(a6),4(a5)        ; set length
  1265.     bsr.w    mt_dmawait
  1266.     move.w    20(a6),d0
  1267.     or.w    #$8000,d0
  1268.     move.w    d0,$dff096
  1269.     bsr.w    mt_dmawait
  1270.     move.l    10(a6),(a5)
  1271.     move.l    14(a6),4(a5)
  1272. mt_rtnend
  1273.     rts
  1274.  
  1275. mt_volumefineup
  1276.     move.b    mt_counter(pc),d1
  1277.     bne.w    mt_return2
  1278.     move.b    3(a6),d0
  1279.     and.b    d5,d0
  1280.     bra.w    mt_volslideup
  1281.  
  1282. mt_volumefinedown
  1283.     move.b    mt_counter(pc),d1
  1284.     bne.w    mt_return2
  1285.     move.b    3(a6),d0
  1286.     and.b    d5,d0
  1287.     bra.w    mt_volslidedown2
  1288.  
  1289. mt_notecut
  1290.     cmp.b    mt_counter(pc),d0
  1291.     bne.w    mt_return2
  1292.     clr.b    19(a6)
  1293.     clr.w    8(a5)
  1294.     rts
  1295.  
  1296. mt_notedelay
  1297.     move.b    3(a6),d0
  1298.     and.b    d5,d0
  1299.     cmp.b    mt_counter(pc),d0
  1300.     bne.w    mt_return2
  1301.     move.w    (a6),d0
  1302.     beq.w    mt_return2
  1303.     bra.b    mt_doretrig
  1304.  
  1305. mt_patterndelay
  1306.     move.b    mt_counter(pc),d1
  1307.     bne.w    mt_return2
  1308.     move.b    mt_pattdeltime2(pc),d1
  1309.     bne.w    mt_return2
  1310.     move.b    3(a6),d0
  1311.     and.b    d5,d0
  1312.     addq.b    #1,d0
  1313.     move.b    d0,mt_pattdeltime-mt_pm(a2)
  1314.     rts
  1315.  
  1316. mt_funkit
  1317.     move.b    mt_counter(pc),d1
  1318.     bne.w    mt_return2
  1319.     move.b    3(a6),d0
  1320.     and.b    d5,d0
  1321.     lsl.b    #4,d0
  1322.     and.b    d5,31(a6)
  1323.     or.b    d0,31(a6)
  1324.     tst.b    d0
  1325.     beq.w    mt_return2
  1326. mt_updatefunk
  1327.     moveq    #0,d0
  1328.     move.b    31(a6),d0
  1329.     lsr.b    #4,d0
  1330.     beq.b    mt_funkend
  1331.     lea    mt_funktable(pc),a4
  1332.     move.b    (a4,d0.w),d0
  1333.     add.b    d0,35(a6)
  1334.     btst    #7,35(a6)
  1335.     beq.b    mt_funkend
  1336.     clr.b    35(a6)
  1337.  
  1338.     move.l    10(a6),d0
  1339.     moveq    #0,d2
  1340.     move.w    14(a6),d2
  1341.     add.w    d2,d2
  1342.     add.l    d2,d0
  1343.     move.l    36(a6),a4
  1344.     addq.l    #1,a4
  1345.     cmp.l    d0,a4
  1346.     blo.b    mt_funkok
  1347.     move.l    10(a6),a4
  1348. mt_funkok
  1349.     move.l    a4,36(a6)
  1350.     moveq    #-1,d0
  1351.     sub.b    (a4),d0
  1352.     move.b    d0,(a4)
  1353. mt_funkend
  1354.     rts
  1355.  
  1356. mt_dmawait
  1357.     if mt_dmawaiter>0
  1358.     moveq    #mt_dmawaiter-1,d4
  1359. mt_waitdma2
  1360.     move.b    $dff006,d3
  1361. mt_waitdma3
  1362.     cmp.b    $dff006,d3
  1363.     beq.b    mt_waitdma3
  1364.     dbf    d4,mt_waitdma2        ;wait some rasters
  1365.     endc
  1366.     rts
  1367.  
  1368. mt_funktable     dc.b     0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1369. mt_vibratotable    dc.b         0, 24, 49, 74, 97,120,141,161
  1370.         dc.b     180,197,212,224,235,244,250,253
  1371.         dc.b     255,253,250,244,235,224,212,197
  1372.         dc.b     180,161,141,120, 97, 74, 49, 24
  1373. mt_periodtable    dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1374.         dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1375.         dc.w    214,202,190,180,170,160,151,143,135,127,120,113    ;0
  1376.         dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1377.         dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1378.         dc.w    213,201,189,179,169,159,150,142,134,126,119,113    ;1
  1379.         dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1380.         dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1381.         dc.w    211,199,188,177,167,158,149,141,133,125,118,112    ;2
  1382.         dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1383.         dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1384.         dc.w    209,198,187,176,166,157,148,140,132,125,118,111    ;3
  1385.         dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1386.         dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1387.         dc.w    208,196,185,175,165,156,147,139,131,124,117,110    ;4
  1388.         dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1389.         dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1390.         dc.w    206,195,184,174,164,155,146,138,130,123,116,109    ;5
  1391.         dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1392.         dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1393.         dc.w    205,193,183,172,163,154,145,137,129,122,115,109    ;6
  1394.         dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1395.         dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1396.         dc.w    204,192,181,171,161,152,144,136,128,121,114,108    ;7
  1397.         dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1398.         dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1399.         dc.w    226,214,202,190,180,170,160,151,143,135,127,120    ;-8
  1400.         dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1401.         dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1402.         dc.w    225,212,200,189,179,169,159,150,142,134,126,119 ;-7
  1403.         dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1404.         dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1405.         dc.w    223,211,199,188,177,167,158,149,141,133,125,118    ;-6
  1406.         dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1407.         dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1408.         dc.w    222,209,198,187,176,166,157,148,140,132,125,118    ;-5
  1409.         dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1410.         dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1411.         dc.w    220,208,196,185,175,165,156,147,139,131,123,117    ;-4
  1412.         dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1413.         dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1414.         dc.w    219,206,195,184,174,164,155,146,138,130,123,116    ;-3
  1415.         dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1416.         dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1417.         dc.w    217,205,193,183,172,163,154,145,137,129,122,115    ;-2
  1418.         dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1419.         dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1420.         dc.w    216,203,192,181,171,161,152,144,136,128,121,114    ;-1
  1421. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0, 0
  1422. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0, 0
  1423. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0, 0
  1424. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0, 0
  1425. mt_samplestarts    dcb.l    31
  1426. mt_speed    dc.b     6
  1427. mt_counter    dc.b     0
  1428. mt_songpos    dc.w     0
  1429. mt_pbreakpos    dc.b     0
  1430. mt_posjumpflag    dc.b     0
  1431. mt_pbreakflag    dc.b     0
  1432. mt_lowmask    dc.b     0
  1433. mt_pattdeltime    dc.b     0
  1434. mt_pattdeltime2    dc.b     0
  1435. mt_maxvol    dc.b    64            ;maximum volume
  1436.         dc.b    0            ;unsed
  1437. mt_patternpos    dc.w     0
  1438. mt_dmacontemp    dc.w     0
  1439. mt_oldirq    dc.l    0
  1440. mt_pm        dcb.w    16
  1441. mt_dataptr    dc.l    mt_data            ;pointer auf sound
  1442.  
  1443. ;------------------------------------------------------------------------------
  1444. ;--- COPPERLISTE --------------------------------------------------------------
  1445. ;------------------------------------------------------------------------------
  1446.  
  1447.     section "dma_things",data_c
  1448.  
  1449. newcopper    
  1450.  
  1451. spritecop    dc.w    $0120,$0000,$0122,$0000,$0124,$0000,$0126,$0000
  1452.         dc.w    $0128,$0000,$012a,$0000,$012c,$0000,$012e,$0000
  1453.         dc.w    $0130,$0000,$0132,$0000,$0134,$0000,$0136,$0000
  1454.         dc.w    $0138,$0000,$013a,$0000,$013c,$0000,$013e,$0000
  1455.  
  1456. bplcon0        dc.w    $0100,$1200
  1457.  
  1458. planecop    dc.w    $00e0,$0000,$00e2,$0000
  1459.  
  1460.         dc.w    $008e,$296b,$0090,$29db
  1461.         dc.w    $0092,$0038,$0094,$00d0
  1462. modulo        dc.w    $0108,$0000,$010a,$0000
  1463.         dc.w    $0102,$0000,$0104,$0064
  1464.         dc.w    $0182,$07aa,$0180,$0000
  1465.  
  1466.         dc.w    $ffff,$fffe
  1467.  
  1468. ;------------------------------------------------------------------------------
  1469. ;--- GRAFIK/SOUND BUFFER ------------------------------------------------------
  1470. ;------------------------------------------------------------------------------
  1471.  
  1472. leersprite    dcb.l    3
  1473. screen1        dcb.b    screenbreite*256
  1474. screen2        dcb.b    screenbreite*256
  1475. screen3        dcb.b    screenbreite*256
  1476.  
  1477.  
  1478. mt_data        incdir    df0:
  1479.         incbin    mod.testmodul.pm
  1480.